// IO函子
const fp = require("lodash/fp");
const fs = require("fs");
class IO {
    static of(value) {
        return new IO(function () {
            return value;
        });
    }
    constructor(fn) {
        this._value = fn;
    }
    map(fn) {
        return new IO(fp.flowRight(fn, this._value));
    }
}

// 模拟cat函数(先读取文件然后打印文件)
let readFile = function readFile(fileName) {
    return new IO(function () {
        return fs.readFileSync(fileName, "utf-8");
    });
};

let print = function print(x) {
    return new IO(function () {
        console.log(x);
        // 将接收到的IO函子再返回出去,从而可以进行链式调用
        return x;
    });
};

let cat = fp.flowRight(print, readFile);

// IO(IO(x)); cat实际上是一个嵌套的函子
// 第一个._value调用的print函数,因为调用由外部开始 第二个._value调用的是readFile
let r = cat("package.json")._value()._value();

console.log(r);
